﻿// renders text 

// нужно что-нибудь для композиции текста. 
// Текст может быть представлен структурой X String, нужно compose X String, X String -> X String
// при этом актуальная операция может происходить с записью в StreamWriter, например.
// очень похоже на моноид.. 
// результирующее значение доставать не нужно.
// можно попробовать через workflow builder, используя операцию yield.

//namespace Lilium

module Yoba 
    
    type YobaBuilder ()  =
        member this.Combine (f1, f2) a = 
            f1 a |> ignore
            f2 a 
        member this.Delay f = f ()
        member this.Return a f = f a
        member this.Zero = id
        member this.Yield a f = f a

    let yoba = YobaBuilder ()

    type 'a RType = RType of ('a -> 'a RType)

    open System.Text

    let rec push (sb : StringBuilder) (s : string) = RType (push (sb.Append s))

    let sb = new StringBuilder()

    (yoba { 
        yield "водка" 
        yield " "
        yield "жрат" 
        yield " "
        yield "земля" 
        yield " "
        yield "валяться" }) (push sb) |> ignore

    let test = sb.ToString ()